#ifndef _DEV_MPU6050_H
#define _DEV_MPU6050_H

#include "device_conf.h"

// MPU6050端口配置
#ifdef STM32F10X
#include "stm32f10x.h"

#define MPU6050_RCC_APBx                    RCC_APB2Periph_GPIOB
#define MPU6050_RCC_APBx_CMD(APBx, state)   RCC_APB2PeriphClockCmd(APBx, state)
#define MPU6050_GPIOx                       GPIOB
#define MPU6050_SCL_GPIO_Pin                GPIO_Pin_6      //定义SCL引脚  可任意更改为其他IO
#define MPU6050_SDA_GPIO_Pin   	            GPIO_Pin_7      //定义SDA引脚  可任意更改为其他IO

// gpio读写设置
#define MPU6050_READ_SDA()          GPIO_ReadInputDataBit(MPU6050_GPIOx, MPU6050_SDA_GPIO_Pin)  // 获取SDA引脚电平
#define MPU6050_SDA_L()             GPIO_ResetBits(MPU6050_GPIOx, MPU6050_SDA_GPIO_Pin)         // SDA口输出低电平
#define MPU6050_SDA_H()             GPIO_SetBits(MPU6050_GPIOx, MPU6050_SDA_GPIO_Pin)           // SDA口输出高电平
#define MPU6050_SCL_L()             GPIO_ResetBits(MPU6050_GPIOx, MPU6050_SCL_GPIO_Pin)         // SCL口输出低电平
#define MPU6050_SCL_H()             GPIO_SetBits(MPU6050_GPIOx, MPU6050_SCL_GPIO_Pin)           // SCL口输出高电平
//#define MPU6050_SDA_OUT()           {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;}
//#define MPU6050_SDA_IN()            {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=8<<28;}
#define MPU6050_SDA_OUT()           do {                                                    \
                                        GPIO_InitTypeDef GPIO_InitStructure;                \
                                        MPU6050_RCC_APBx_CMD(MPU6050_RCC_APBx, ENABLE);     \
                                        GPIO_InitStructure.GPIO_Pin = MPU6050_SDA_GPIO_Pin; \
                                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    \
                                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   \
                                        GPIO_Init(MPU6050_GPIOx, &GPIO_InitStructure);      \
                                    } while(0)
#define MPU6050_SDA_IN()            do {                                                    \
                                        GPIO_InitTypeDef GPIO_InitStructure;                \
                                        MPU6050_RCC_APBx_CMD(MPU6050_RCC_APBx, ENABLE);     \
                                        GPIO_InitStructure.GPIO_Pin = MPU6050_SDA_GPIO_Pin; \
                                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       \
                                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   \
                                        GPIO_Init(MPU6050_GPIOx, &GPIO_InitStructure);      \
                                    } while(0)
#endif

// 陀螺仪采集数据结构体               
typedef struct _mpu6050_data_t
{
    struct // 原始数据（整型）
    {
        int16     x;
        int16     y;
        int16     z;
    } acc, gyro;
    
    struct // 原始数据（浮点型）
    {
        float     x;
        float     y;
        float     z;
    } acc_raw, gyro_raw;
} mpu6050_data_t;
extern mpu6050_data_t mpu6050_data;

void mpu6050_init(void); // MPU6050设备初始化
void mpu6050_get_raw_data(void); // 获取MPU6050原始数据


#endif
